package com.rad.net.protocol.android.encoder;

import java.util.ArrayList;

import android.text.TextUtils;

import com.rad.net.protocol.common.annotation.NotNull;
import com.rad.net.protocol.common.annotation.Reg;
import com.rad.net.protocol.common.cmd.BaseCmd;


/** 
 * 类说明：编码验证器类，负责对字段的<b> 注释 </b>验证
 * @author  xinhui.cheng
 * @date    2014-8-20
 * @version 1.0
 */
public class EncodeValidator {

	private EncodeValidator(){}
	
	
	/**
	 * 通过字段注释来校验字段值是否合法
	 * @param cmd
	 * @param list
	 * @return 验证<b>通过</b>则返回null<br>
	 *               <b>不通过</b>则返回错误信息
	 */
	public static String verifyClassFields(BaseCmd cmd , ArrayList<FieldInfo> list){
		if(list == null || cmd == null){
			return null;
		}
		String r = null;
		for(FieldInfo f:list){	
			//非空检查
			r=verifyNotNull(f,cmd);
			if(r!=null){
				return r;
			}
						
			//内容格式检查
			r=verifyMatch(f,cmd);
			if(r!=null){
				return r;
			}
		}
		return null;
	}
	
	/**
	 * 属性值域非空判断
	 * @param f
	 * @param cmd
	 * @return
	 */
	private static String verifyNotNull(FieldInfo f,BaseCmd cmd){
		NotNull nn=f.getField().getAnnotation(NotNull.class);
		Object value=f.getAttribute(cmd);
		if(nn!=null && value==null){
			String message=!TextUtils.isEmpty(nn.message())?nn.message():f.getFieldName()+" is null";
			return message;
		}
		return null;
	}
	
	/**
	 * 属性值域正则表达式判断
	 * @param f
	 * @param cmd
	 * @return
	 */
	private static  String verifyMatch(FieldInfo f,BaseCmd cmd){
		Reg ma=f.getField().getAnnotation(Reg.class);
		Object value=f.getAttribute(cmd);
		if(ma!=null && value!=null){
			String regex=ma.value();
			if(!TextUtils.isEmpty(regex) && !value.toString().matches(regex)){
				String message=!TextUtils.isEmpty(ma.message())?ma.message():
					f.getField().getName()+" is not match regex:"+regex;
				return message;
			}
		}
		
		return null;
	}
	
}
